<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1. 实现一个对象 或者是数组的深拷贝


        // 一层对象的拷贝 
        // var obj1 = {
        //     name: "张安",
        //     age: 20
        // }


        // var obj2 = obj1;

        // var obj2 = {};

        // for (var key in obj1) {
        //     // obj2['key']
        //     obj2[key] = obj1[key];  // 把obj1里的键名和键值 加入到 obj2对象里
        // }
        // console.log(obj2);


        // 把对象的拷贝封装成函数 
        // function deepCopy(obj1) {
        //     var obj2 = {};
        //     for (var key in obj1) {
        //         // obj2['key']
        //         obj2[key] = obj1[key];  // 把obj1里的键名和键值 加入到 obj2对象里
        //     }
        //     return obj2;
        // }




        // 数组的深拷贝
        // var obj1 = ["张三","李四","王五"];

        // var obj2 = [];

        // for (var key in obj1) {
        //     // obj2['key']
        //     obj2[key] = obj1[key];  // 把obj1里的键名和键值 加入到 obj2对象里
        // }
        // console.log(obj2);


        // 封装成函数 ：如果给的原始数据是对象 ，那么需要一个新对象 如果是一个数组 那么需要一个新数组 添加
        // function deepCopy(obj1) {
        //     // 判断 obj1的数据类型 根据 obj1的类型生成对象或者数组
        //     var obj2 = Object.prototype.toString.call(obj1)==="[object Array]"?[]:{};
        //     for (var key in obj1) {
        //         // obj2['key']
        //         obj2[key] = obj1[key];  // 把obj1里的键名和键值 加入到 obj2对象里
        //     }
        //     return obj2;
        // }
        // var arr = [1,2,3];
        // var obj = {
        //     myname:"张安"
        // }
        // var arr2 = deepCopy(obj);
        // console.log(arr2);
        // console.log(typeof {});
        // console.log(typeof []);
        // console.log(typeof function(){});
        // typeof 可以区分 简单数据类型 和 function
        // 精确判断数据类型 
        // console.log( Object.prototype.toString.call([]));  // 任意类型
        // console.log( Object.prototype.toString.call({}));
        // console.log( Object.prototype.toString.call(null));
        // console.log( Object.prototype.toString.call(undefined));
        // console.log( Object.prototype.toString.call(function(){}));
        // console.log( Object.prototype.toString.call(/\d/));
        // console.log( Object.prototype.toString.call(Symbol()));
        // console.log( Object.prototype.toString.call("fdsafda"));
        // console.log( Object.prototype.toString.call(12323));
        // console.log( Object.prototype.toString.call(true));






        // 2. 多层的数组或者对象的深拷贝
        var obj1 = {
            myname: "张安",
            hobby: ["篮球", "足球"]
        }

        function deepCopy(obj1) {
            // 判断 obj1的数据类型 根据 obj1的类型生成对象或者数组
            var obj2 = Object.prototype.toString.call(obj1) === "[object Array]" ? [] : {};
            for (var key in obj1) {
                if (obj1.hasOwnProperty(key)) {
                    // obj2['key']
                    if (typeof obj1[key] === "object") {
                        obj2[key] = deepCopy(obj1[key]);
                    } else {
                        obj2[key] = obj1[key];  // 把obj1里的键名和键值 加入到 obj2对象里
                    }
                }

            }
            return obj2;
        }


        // console.log(obj1);
        var obj2 = deepCopy(obj1);
        // console.log(obj2);
        // obj2.myname= "李四";
        // console.log(obj1);
        obj2.hobby[0] = "hello";
        console.log("obj2", obj2)
        console.log("obj1", obj1);
    </script>
</body>

</html>